package com.cwm.test.proxy.cglib;

import com.cwm.test.proxy.staticproxy.OldClass;
import com.cwm.test.proxy.staticproxy.Source;
import org.springframework.cglib.core.DebuggingClassWriter;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;

public class Main {


    // cglib 采用继承的方式，覆盖父类的方法
    // JDK采用实现的方式，必须要求代理的目标对象，一定要实现一个接口
    // 思想，都是通过生成字节码，重组成一个新的类
    // jdk对用户而言依赖性更强，更复杂（必须依赖一个接口）。生成逻辑较为简单，执行效率低（用到反射）
    // cglib对目标类没有任何要求，效率更高，性能更高。底层没有用到反射
    // cglib有个坑，会忽略 final修饰的方法，所以，目标代理类不能有final方法
    public static void main(String[] args) {
//        Enhancer enhancer = new Enhancer();
//        enhancer.setSuperclass(OldClass.class);
//        enhancer.setCallback(new ProxyInterceptor());
//        OldClass proxy = (OldClass) enhancer.create();
//        for (int i=1;i<11;i++) {
//            OldClass proxy = (OldClass)ProxyInterceptor.getInstance(OldClass.class);
//
//
//            int a = 1, b = 2;
//            System.out.println("add: " + proxy.add(a, b));
//            System.out.println("sub: " + proxy.sub(a, b));
//            System.out.println("mul: " + proxy.mul(a, b));
//            System.out.println("div: " + proxy.div(a, b));
//        }
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"C://cglib_proxy_classes");
        OldClass proxy = (OldClass)ProxyInterceptor.getInstance(OldClass.class);
        proxy.add(1,2);
//        byte[] bytes = ProxyGenerator.generateProxyClass("OldClass$$EnhancerByCGLIB$$88bf92de.class",new Class[]{ Source.class });
//        try{
//            FileOutputStream os = new FileOutputStream("C://$Proxy1.class");
//            os.write(bytes);
//        }catch (Exception e){
//
//        }
    }
}